﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormCadastroMensalista : Form
    {
        private string operacao = "";

        public FormCadastroMensalista()
        {
            InitializeComponent();

        }

        private void FormCadastroMensalista_Load(object sender, EventArgs e)
        {
            List<ConvenioVO> listConvenioVOs = ModelBO.getConvenios(true);
            List<ClienteVO> listClienteVOs = ModelBO.getClientes(true);
            // remover os clientes conveniados da lista
            foreach (ConvenioVO convenioVO in listConvenioVOs)
            {
                ClienteVO clienteVO = listClienteVOs.Find(c => c.idCliente == convenioVO.idCliente);
                if (clienteVO != null)
                    listClienteVOs.Remove(clienteVO);
            }

            //Popular a lista de mensalistas cadastrados
            this.dataGridViewMensalistas.DataSource = ModelBO.getMensalistas();
            this.comboBoxCliente.DataSource = listClienteVOs;
            this.comboBoxTabelaMensal.DataSource = ModelBO.getTabelaMensals(null, true);

             setupButtonsControls();
        }

        private void dataGridViewMensalista_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
        }

        private void buttonNovo_Click(object sender, EventArgs e)
        {
            this.operacao = "novo";
            setupButtonsControls();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            this.operacao = "excluir";

            List<MensalistaVO> mensalistaList = (List<MensalistaVO>)this.dataGridViewMensalistas.DataSource;
            MensalistaVO mensalista = mensalistaList[this.dataGridViewMensalistas.CurrentRow.Index];
            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do mensalista " + mensalista.clienteVO.nome, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.getMensalistaXVeiculos(mensalista);
                ModelBO.delMensalistaXVeiculos(mensalista.mensalistaxVeiculoVOs);
                
                ModelBO.delMensalista(mensalista);

                int nRow = this.dataGridViewMensalistas.CurrentRow.Index;
                this.dataGridViewMensalistas.DataSource = ModelBO.getMensalistas();
                if (this.dataGridViewMensalistas.Rows.Count > 0)
                {
                    dataGridViewMensalistas.CurrentCell = dataGridViewMensalistas.Rows[Math.Min(nRow, this.dataGridViewMensalistas.Rows.Count - 1)].Cells[0];
                    dataGridViewMensalistas.Rows[Math.Min(nRow, this.dataGridViewMensalistas.Rows.Count - 1)].Selected = true;
                }

                setupButtonsControls();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            if (this.numericUpDownDiaPgto.Value == 0)
                erros = erros + "Dia para pagamento deve ser informado.\r\n";

            List<MensalistaxVeiculoVO> listaMensalistaxVeiculoVO = new List<MensalistaxVeiculoVO>();
            foreach (DataGridViewRow dgvRow in dataGridViewVeiculos.Rows)
            {
                if (((string)dgvRow.Cells["placa"].Value).Trim().Length > 0)
                {
                    MensalistaxVeiculoVO mensalistaxVeiculoVO = MensalistaxVeiculoVO.CreateMensalistaxVeiculoVO();
                    mensalistaxVeiculoVO.idMensalista = (this.operacao.Equals("novo")?-1:int.Parse(this.textBoxId.Text));
                    mensalistaxVeiculoVO.placa = ((string)dgvRow.Cells["placa"].Value).ToUpper();
                    mensalistaxVeiculoVO.obs = (string)dgvRow.Cells["obs"].Value;
                    if (listaMensalistaxVeiculoVO.Count(mv => mv.placa.Equals(((string)dgvRow.Cells["placa"].Value).ToUpper())) > 0)
                    {
                        erros = erros + "Veículo " + (string)dgvRow.Cells["placa"].Value + " consta em duplicidade\r\n";
                    }
                    else
                    {
                        listaMensalistaxVeiculoVO.Add(mensalistaxVeiculoVO);
                    }
                }
            }
           
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            MensalistaVO mensalista = null;

            if (this.operacao.Equals("novo"))
            {

                mensalista = MensalistaVO.CreateMensalistaVO();
                mensalista.ativo = this.checkBoxAtivo.Checked;
                mensalista.diaPgto = (int) this.numericUpDownDiaPgto.Value;
                mensalista.idTabelaMensal = (int) this.comboBoxTabelaMensal.SelectedValue;
                mensalista.idCliente = (int)this.comboBoxCliente.SelectedValue;
                mensalista.qtdVagas = (int)this.numericUpDownQtdVagas.Value;
                mensalista.situacao = this.textBoxSituacao.Text;
                mensalista.cadastro = DateTime.Today;
                mensalista.edicao = DateTime.Today;

                mensalista.idMensalista = (int)ModelBO.newMensalista(mensalista);
                foreach (MensalistaxVeiculoVO mensalistaXVeiculoVO in listaMensalistaxVeiculoVO)
                {
                    mensalistaXVeiculoVO.idMensalista = mensalista.idMensalista;
                }
                ModelBO.newMensalistaXVeiculos(listaMensalistaxVeiculoVO);
            }
            if (this.operacao.Equals("editar"))
            {
                List<MensalistaVO> mensalistaList = (List<MensalistaVO>)this.dataGridViewMensalistas.DataSource;
                mensalista = mensalistaList[this.dataGridViewMensalistas.CurrentRow.Index];

                mensalista.ativo = this.checkBoxAtivo.Checked;
                mensalista.diaPgto = (int)this.numericUpDownDiaPgto.Value;
                mensalista.idCliente = (int)this.comboBoxCliente.SelectedValue;
                mensalista.idTabelaMensal = (int)this.comboBoxTabelaMensal.SelectedValue;
                mensalista.qtdVagas = (int)this.numericUpDownQtdVagas.Value;
                mensalista.situacao = this.textBoxSituacao.Text;
                mensalista.edicao = DateTime.Today;

                ModelBO.setMensalista(mensalista);

                // salvar veiculos do mensalista
                ModelBO.getMensalistaXVeiculos(mensalista);
                ModelBO.delMensalistaXVeiculos(mensalista.mensalistaxVeiculoVOs);
                ModelBO.newMensalistaXVeiculos(listaMensalistaxVeiculoVO);
            }

            this.operacao = "salvar";

            List<MensalistaVO> listMensalistaVOs = ModelBO.getMensalistas();
            dataGridViewMensalistas.DataSource = listMensalistaVOs;
            int nRow = listMensalistaVOs.FindIndex(a => a.idMensalista == mensalista.idMensalista);
            dataGridViewMensalistas.CurrentCell = dataGridViewMensalistas.Rows[nRow].Cells[0];
            dataGridViewMensalistas.Rows[nRow].Selected = true;

            setupButtonsControls();
        }

        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewMensalistas.Rows.Count > 0 && this.dataGridViewMensalistas.CurrentRow!=null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.buttonCancelar.Enabled = novo || edit;
            this.buttonNovo.Enabled = !novo && !edit;
            this.buttonEditar.Enabled = haRows && !novo && !edit;
            this.buttonExcluir.Enabled = haRows && !novo && !edit;
            this.buttonSalvar.Enabled = novo || edit;

            this.numericUpDownDiaPgto.Enabled = novo || edit;
            this.numericUpDownQtdVagas.Enabled = novo || edit;
            this.comboBoxCliente.Enabled = novo || edit;
            this.comboBoxTabelaMensal.Enabled = novo || edit;
            this.checkBoxAtivo.Enabled = novo || edit;

            this.dataGridViewMensalistas.Enabled = !novo && !edit;

            this.dataGridViewVeiculos.Enabled = novo || edit;
            this.dataGridViewVeiculos.ReadOnly = !novo && !edit;
            this.buttonIncluirVeiculo.Enabled = novo || edit;
            
            if (!haRows || novo)
            {
                this.textBoxId.Text = "";
                this.textBoxSituacao.Text = "Em aberto";
                this.numericUpDownDiaPgto.Value = 1;
                this.numericUpDownQtdVagas.Value = 1;
                this.checkBoxAtivo.Checked = false;
                this.textBoxCadastro.Text = "";
                this.textBoxEdicao.Text = "";

                this.dataGridViewVeiculos.Rows.Clear();
            }
            else {
                List<MensalistaVO> mensalistaList = (List<MensalistaVO>)this.dataGridViewMensalistas.DataSource;
                MensalistaVO mensalista = mensalistaList[this.dataGridViewMensalistas.CurrentRow.Index];
                this.textBoxId.Text = mensalista.idMensalista.ToString();
                this.textBoxSituacao.Text = mensalista.situacao;
                this.checkBoxAtivo.Checked = mensalista.ativo;
                this.comboBoxCliente.SelectedValue = mensalista.idCliente;
                this.comboBoxTabelaMensal.SelectedValue = mensalista.idTabelaMensal;
                this.numericUpDownDiaPgto.Value = mensalista.diaPgto;
                this.numericUpDownQtdVagas.Value = mensalista.qtdVagas;
                this.textBoxCadastro.Text = mensalista.cadastro.ToString();
                this.textBoxEdicao.Text = mensalista.edicao.ToString();

                ModelBO.getMensalistaXVeiculos(mensalista);
                this.dataGridViewVeiculos.Rows.Clear();
                foreach (MensalistaxVeiculoVO mensalistaxVeiculoVO in mensalista.mensalistaxVeiculoVOs)
                {
                    int nrow = this.dataGridViewVeiculos.Rows.Add();
                    DataGridViewRow dgvRow = dataGridViewVeiculos.Rows[nrow];
                    dgvRow.Cells["placa"].Value = mensalistaxVeiculoVO.placa;
                    dgvRow.Cells["obs"].Value = mensalistaxVeiculoVO.obs;
                }
            }
            if (novo || edit){
                this.numericUpDownDiaPgto.Focus();
            }
        }

        private void dataGridViewMensalistas_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            DataGridView dgv = (DataGridView)sender;
            foreach (DataGridViewRow dgvr in dgv.Rows)
            {
                MensalistaVO cvo = (MensalistaVO)dgvr.DataBoundItem;
                dgvr.Cells["cliente"].Value = cvo.clienteVO.nome;
                dgvr.Cells["tabelaMensal"].Value = cvo.tabelaMensalVO.tabelaMensal;
            }

        }

        private void buttonIncluirVeiculo_Click(object sender, EventArgs e)
        {
            DataGridViewRow dgvRow = this.dataGridViewVeiculos.Rows[this.dataGridViewVeiculos.Rows.Add()];
            dgvRow.Cells["placa"].Value = "";
            dgvRow.Cells["obs"].Value = "";
        }

        private void dataGridViewVeiculos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                if (this.dataGridViewVeiculos.Columns[e.ColumnIndex].Name.Equals("buttonExcluirVeiculo"))
                {
                    DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do veiculo " + (string)dataGridViewVeiculos.Rows[e.RowIndex].Cells["placa"].Value, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr.ToString().Equals("Yes"))
                        dataGridViewVeiculos.Rows.RemoveAt(e.RowIndex);
                }
            }
        }
     }
}
